package github.flandre.examplemod.common.energy;

import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;

public interface IBlockNetwork
{
    int size(BlockPos node);

    BlockPos root(BlockPos node);

    void cut(BlockPos node, Direction direction, ConnectivityListener afterSplit);

    void link(BlockPos node, Direction direction, ConnectivityListener beforeMerge);

    @FunctionalInterface
    interface ConnectivityListener
    {
        void onChange(BlockPos primaryNode, BlockPos secondaryNode);
    }

    //size 返回的是导线所处连通域含有的导线数量，如果导线没有和其他导线连通，那么返回值为 1。
    //root 返回的是导线所处连通域的代表导线，也有可能是该导线自身（比方说未和其他导线连通的时候）。
    //cut 指将某根导线的某个方向切断。切断导线如果会导致一个连通域分裂成两个，那么会在分裂后调用 afterSplit 的相关方法。
    //link 指将某根导线在某个方向上实施连接。连接导线如果会导致两个连通域合并为一个，那么会在合并前调用 beforeMerge 的相关方法。
    //onChange 方法将在连通域发生变化时调用，其中第一个参数是主连通域（其代表导线不会发生变化），而第二个参数是次连通域（会由于合并而消失，或由于分裂而新出现）。
}